bitkeeper revision 1.1159.172.5 (4194efbdtn0wkhatZ5h3AhSTCQkn2g)
authorcl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 12 Nov 2004 17:15:41 +0000 (17:15 +0000)
committercl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 12 Nov 2004 17:15:41 +0000 (17:15 +0000)
Add hooks for debuggers.

.rootkeys
xen/arch/x86/traps.c
xen/include/xen/debugger_hooks.h [new file with mode: 0644]

index 2a93a73caca7b0487b4ab557b2aa2673c3276f59..b3c7cea0c4b6b5b693bea2f50fd1bbd6b9eae9cf 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 3ddb79c259jh8hE7vre_8NuE7nwNSA xen/include/xen/config.h
 3eb165e0eawr3R-p2ZQtSdLWtLRN_A xen/include/xen/console.h
 3ddb79c1V44RD26YqCUm-kqIupM37A xen/include/xen/ctype.h
+4194efbdvxUXjCLobbopgLOojisO4Q xen/include/xen/debugger_hooks.h
 3ddb79c05DdHQ0UxX_jKsXdR4QlMCA xen/include/xen/delay.h
 3ddb79c2O729EttZTYu1c8LcsUO_GQ xen/include/xen/elf.h
 3ddb79c0HIghfBF8zFUdmXhOU8i6hA xen/include/xen/errno.h
index b15939d6cfa789fc77649e9b5740af96428b00a6..2026432ec006dfd6bd3ac79008ee9aa4ab2bab5e 100644 (file)
@@ -51,6 +51,7 @@
 #include <asm/uaccess.h>
 #include <asm/i387.h>
 #include <asm/pdb.h>
+#include <xen/debugger_hooks.h>
 
 extern char opt_nmi[];
 
@@ -243,6 +244,9 @@ static inline void do_trap(int trapnr, char *str,
         return;
     }
 
+    if (debugger_trap(trapnr, regs))
+       return;
+
     show_registers(regs);
     panic("CPU%d FATAL TRAP: vector = %d (%s)\n"
           "[error_code=%08x]\n",
@@ -280,10 +284,8 @@ asmlinkage void do_int3(struct xen_regs *regs, long error_code)
     struct guest_trap_bounce *gtb = guest_trap_bounce+smp_processor_id();
     trap_info_t *ti;
 
-#ifdef XEN_DEBUGGER
-    if ( pdb_initialized && pdb_handle_exception(3, regs) == 0 )
+    if (debugger_trap(3, regs))
         return;
-#endif
 
     if ( (regs->cs & 3) != 3 )
     {
@@ -329,6 +331,8 @@ asmlinkage void do_double_fault(void)
     printk("System needs manual reset.\n");
     printk("************************************\n");
 
+    debugger_trap(8, NULL);
+
     /* Lock up the console to prevent spurious output from other CPUs. */
     console_force_lock();
 
@@ -406,6 +410,9 @@ asmlinkage void do_page_fault(struct xen_regs *regs, long error_code)
         return;
     }
 
+    if (debugger_trap(14, regs))
+       return;
+
     if ( addr >= PAGE_OFFSET )
     {
         unsigned long page;
@@ -423,17 +430,6 @@ asmlinkage void do_page_fault(struct xen_regs *regs, long error_code)
 #endif
     }
 
-#ifdef XEN_DEBUGGER
-    if ( pdb_page_fault_possible )
-    {
-        pdb_page_fault = 1;
-        /* make eax & edx valid to complete the instruction */
-        regs->eax = (long)&pdb_page_fault_scratch;
-        regs->edx = (long)&pdb_page_fault_scratch;
-        return;
-    }
-#endif
-
     show_registers(regs);
     panic("CPU%d FATAL PAGE FAULT\n"
           "[error_code=%08x]\n"
@@ -520,6 +516,9 @@ asmlinkage void do_general_protection(struct xen_regs *regs, long error_code)
         return;
     }
 
+    if (debugger_trap(13, regs))
+       return;
+
     die("general protection fault", regs, error_code);
 }
 
@@ -565,6 +564,9 @@ asmlinkage void io_check_error(struct xen_regs *regs)
 
 static void unknown_nmi_error(unsigned char reason, struct xen_regs * regs)
 {
+    if (debugger_trap(2, regs))
+       return;
+
     printk("Uhhuh. NMI received for unknown reason %02x.\n", reason);
     printk("Dazed and confused, but trying to continue\n");
     printk("Do you have a strange power saving mode enabled?\n");
diff --git a/xen/include/xen/debugger_hooks.h b/xen/include/xen/debugger_hooks.h
new file mode 100644 (file)
index 0000000..4663b2b
--- /dev/null
@@ -0,0 +1,37 @@
+
+#ifndef __DEBUGGER_HOOKS_H__
+#define __DEBUGGER_HOOKS_H__
+
+static inline int debugger_trap(int type, struct xen_regs *regs)
+{
+    int ret = 0;
+
+#ifdef XEN_DEBUGGER
+    switch (type) {
+    case 3:
+        if ( pdb_initialized && pdb_handle_exception(type, regs) == 0 )
+            return 1;
+        break;
+    case 14:
+        if ( pdb_page_fault_possible )
+        {
+            pdb_page_fault = 1;
+            /* make eax & edx valid to complete the instruction */
+            regs->eax = (long)&pdb_page_fault_scratch;
+            regs->edx = (long)&pdb_page_fault_scratch;
+            return 1;
+        }
+        break;
+    }
+#endif
+
+#if 0
+    extern int kdb_trap(int, int, struct xen_regs *);
+    if ((ret = kdb_trap(type, 0, regs)))
+        return ret;
+#endif
+
+    return ret;
+}
+
+#endif /* __DEBUGGER_HOOKS_H__ */